/**
 * 权限控制系统
 * 用于管理不同用户角色的权限控制
 */

class PermissionManager {
    constructor() {
        this.currentUser = null;
        this.userRoles = {
            ADMIN: 'ADMIN',           // 系统管理员
            DEPT_MANAGER: 'DEPT_MANAGER', // 部门经理
            DISPATCHER: 'DISPATCHER',     // 调度员
            END_USER: 'END_USER'          // 终端用户
        };
        
        this.permissions = {
            // 部门管理权限
            DEPARTMENT_MANAGEMENT: {
                ADMIN: { access: true, manage: true, scope: 'all' },
                DEPT_MANAGER: { access: true, manage: true, scope: 'department' },
                DISPATCHER: { access: false, manage: false, scope: 'none' },
                END_USER: { access: false, manage: false, scope: 'none' }
            },
            
            // 事件管理权限
            EVENT_MANAGEMENT: {
                ADMIN: { access: true, manage: true, create: true, edit: true, delete: true, scope: 'all' },
                DEPT_MANAGER: { access: true, manage: true, create: true, edit: true, delete: true, scope: 'department' },
                DISPATCHER: { access: true, manage: true, create: true, edit: true, delete: true, scope: 'all' },
                END_USER: { access: false, manage: false, create: false, edit: false, delete: false, scope: 'none' }
            },
            
            // 用户管理权限
            USER_MANAGEMENT: {
                ADMIN: { access: true, manage: true, create: true, edit: true, delete: true, scope: 'all' },
                DEPT_MANAGER: { access: true, manage: true, create: true, edit: true, delete: true, scope: 'department' },
                DISPATCHER: { access: true, manage: false, create: false, edit: false, delete: false, scope: 'view' },
                END_USER: { access: false, manage: false, create: false, edit: false, delete: false, scope: 'none' }
            },
            
            // 资源调度权限
            RESOURCE_MANAGEMENT: {
                ADMIN: { access: true, manage: true, create: true, edit: true, delete: true, scope: 'all' },
                DEPT_MANAGER: { access: true, manage: true, create: true, edit: true, delete: true, scope: 'department' },
                DISPATCHER: { access: true, manage: false, create: false, edit: false, delete: false, scope: 'view' },
                END_USER: { access: false, manage: false, create: false, edit: false, delete: false, scope: 'none' }
            },
            
            // 报告管理权限
            REPORT_MANAGEMENT: {
                ADMIN: { access: true, manage: true, create: true, edit: true, delete: true, scope: 'all' },
                DEPT_MANAGER: { access: true, manage: true, create: true, edit: true, delete: true, scope: 'department' },
                DISPATCHER: { access: true, manage: false, create: false, edit: false, delete: false, scope: 'view' },
                END_USER: { access: false, manage: false, create: false, edit: false, delete: false, scope: 'none' }
            },
            
            // 调度中心权限
            DISPATCH_CENTER: {
                ADMIN: { access: true, manage: true, create: true, edit: true, scope: 'all' },
                DEPT_MANAGER: { access: true, manage: true, create: true, edit: true, scope: 'department' },
                DISPATCHER: { access: true, manage: true, create: true, edit: true, scope: 'all' },
                END_USER: { access: false, manage: false, create: false, edit: false, scope: 'none' }
            }
        };
    }

    /**
     * 初始化权限管理器
     * @param {Object} userInfo - 用户信息
     */
    init(userInfo) {
        this.currentUser = userInfo;
        console.log('PermissionManager initialized with user:', userInfo);
    }

    /**
     * 获取当前用户信息
     * @returns {Object|null} 用户信息
     */
    getCurrentUser() {
        return this.currentUser;
    }

    /**
     * 获取用户角色
     * @returns {String|null} 用户角色
     */
    getUserRole() {
        return this.currentUser ? this.currentUser.role : null;
    }

    /**
     * 检查用户是否有指定权限
     * @param {String} permission - 权限名称
     * @param {String} action - 具体操作 (access, manage, create, edit, delete)
     * @returns {Boolean} 是否有权限
     */
    hasPermission(permission, action = 'access') {
        if (!this.currentUser || !this.currentUser.role) {
            return false;
        }

        // 系统管理员拥有所有权限
        if (this.currentUser.role === 'ADMIN') {
            return true;
        }

        const rolePermissions = this.permissions[permission];
        if (!rolePermissions) {
            console.warn(`Permission ${permission} not defined`);
            return false;
        }

        const userRolePermissions = rolePermissions[this.currentUser.role];
        if (!userRolePermissions) {
            console.warn(`Role ${this.currentUser.role} not defined for permission ${permission}`);
            return false;
        }

        return userRolePermissions[action] === true;
    }

    /**
     * 检查用户是否有任意指定权限
     * @param {Array} permissions - 权限名称数组
     * @param {String} action - 具体操作
     * @returns {Boolean} 是否有权限
     */
    hasAnyPermission(permissions, action = 'access') {
        return permissions.some(permission => this.hasPermission(permission, action));
    }

    /**
     * 检查用户是否有所有指定权限
     * @param {Array} permissions - 权限名称数组
     * @param {String} action - 具体操作
     * @returns {Boolean} 是否有权限
     */
    hasAllPermissions(permissions, action = 'access') {
        return permissions.every(permission => this.hasPermission(permission, action));
    }

    /**
     * 获取权限范围
     * @param {String} permission - 权限名称
     * @returns {String} 权限范围 (all, department, view, none)
     */
    getPermissionScope(permission) {
        if (!this.currentUser || !this.currentUser.role) {
            return 'none';
        }

        const rolePermissions = this.permissions[permission];
        if (!rolePermissions) {
            return 'none';
        }

        const userRolePermissions = rolePermissions[this.currentUser.role];
        if (!userRolePermissions) {
            return 'none';
        }

        return userRolePermissions.scope || 'none';
    }

    /**
     * 检查是否可以管理指定部门
     * @param {Number} departmentId - 部门ID
     * @returns {Boolean} 是否可以管理
     */
    canManageDepartment(departmentId) {
        if (!this.currentUser) return false;
        
        if (this.currentUser.role === 'ADMIN') return true;
        
        if (this.currentUser.role === 'DEPT_MANAGER') {
            // 部门经理只能管理自己的部门
            return this.currentUser.departmentId === departmentId;
        }
        
        return false;
    }

    /**
     * 检查是否可以管理指定用户
     * @param {Object} targetUser - 目标用户信息
     * @returns {Boolean} 是否可以管理
     */
    canManageUser(targetUser) {
        if (!this.currentUser || !targetUser) return false;
        
        if (this.currentUser.role === 'ADMIN') {
            // 系统管理员不能删除自己
            return targetUser.id !== this.currentUser.id;
        }
        
        if (this.currentUser.role === 'DEPT_MANAGER') {
            // 部门经理只能管理自己部门的终端用户
            return targetUser.role === 'END_USER' && 
                   targetUser.departmentId === this.currentUser.departmentId;
        }
        
        return false;
    }

    /**
     * 检查是否可以管理指定事件
     * @param {Object} event - 事件信息
     * @returns {Boolean} 是否可以管理
     */
    canManageEvent(event) {
        if (!this.currentUser || !event) return false;
        
        if (this.currentUser.role === 'ADMIN') return true;
        
        if (this.currentUser.role === 'DISPATCHER') return true;
        
        if (this.currentUser.role === 'DEPT_MANAGER') {
            // 部门经理只能管理自己部门的事件（通过处理人）
            if (event.handler && event.handler.departmentId) {
                return event.handler.departmentId === this.currentUser.departmentId;
            }
            // 如果事件没有处理人或处理人没有部门，部门经理不能管理
            return false;
        }
        
        return false;
    }

    /**
     * 检查是否可以管理指定资源
     * @param {Object} resource - 资源信息
     * @returns {Boolean} 是否可以管理
     */
    canManageResource(resource) {
        if (!this.currentUser || !resource) return false;
        
        if (this.currentUser.role === 'ADMIN') return true;
        
        if (this.currentUser.role === 'DEPT_MANAGER') {
            // 部门经理只能管理自己部门的资源
            return resource.departmentId === this.currentUser.departmentId;
        }
        
        return false;
    }

    /**
     * 检查是否可以管理指定报告
     * @param {Object} report - 报告信息
     * @returns {Boolean} 是否可以管理
     */
    canManageReport(report) {
        if (!this.currentUser || !report) return false;
        
        if (this.currentUser.role === 'ADMIN') return true;
        
        if (this.currentUser.role === 'DEPT_MANAGER') {
            // 部门经理只能管理自己部门的报告
            return report.departmentId === this.currentUser.departmentId;
        }
        
        return false;
    }

    /**
     * 获取角色显示名称
     * @param {String} role - 角色代码
     * @returns {String} 角色显示名称
     */
    getRoleDisplayName(role) {
        const roleNames = {
            'ADMIN': '系统管理员',
            'DEPT_MANAGER': '部门经理',
            'DISPATCHER': '调度员',
            'END_USER': '终端用户'
        };
        return roleNames[role] || role;
    }

    /**
     * 获取角色徽章样式
     * @param {String} role - 角色代码
     * @returns {String} 徽章样式类名
     */
    getRoleBadgeClass(role) {
        const badgeClasses = {
            'ADMIN': 'bg-primary',
            'DEPT_MANAGER': 'bg-success',
            'DISPATCHER': 'bg-warning text-dark',
            'END_USER': 'bg-secondary'
        };
        return badgeClasses[role] || 'bg-secondary';
    }

    /**
     * 获取角色图标
     * @param {String} role - 角色代码
     * @returns {String} 图标HTML
     */
    getRoleIcon(role) {
        const icons = {
            'ADMIN': '<i class="bi bi-shield-check"></i>',
            'DEPT_MANAGER': '<i class="bi bi-building"></i>',
            'DISPATCHER': '<i class="bi bi-headset"></i>',
            'END_USER': '<i class="bi bi-person"></i>'
        };
        return icons[role] || '<i class="bi bi-person"></i>';
    }

    /**
     * 显示访问被拒绝页面
     * @param {String} message - 拒绝消息
     */
    showAccessDenied(message = '您没有权限访问此功能') {
        const deniedHtml = `
            <div class="text-center py-5">
                <i class="bi bi-shield-exclamation text-danger" style="font-size: 4rem;"></i>
                <h3 class="mt-3">访问被拒绝</h3>
                <p class="text-muted">${message}</p>
                <a href="/ercms/dashboard" class="btn btn-primary">
                    <i class="bi bi-house"></i> 返回首页
                </a>
            </div>
        `;
        
        // 替换页面内容
        document.body.innerHTML = deniedHtml;
    }

    /**
     * 隐藏无权限的元素
     * @param {String} selector - 元素选择器
     */
    hideElement(selector) {
        const element = document.querySelector(selector);
        if (element) {
            element.style.display = 'none';
        }
    }

    /**
     * 显示有权限的元素
     * @param {String} selector - 元素选择器
     */
    showElement(selector) {
        const element = document.querySelector(selector);
        if (element) {
            element.style.display = '';
        }
    }

    /**
     * 根据权限控制元素显示/隐藏
     * @param {String} selector - 元素选择器
     * @param {String} permission - 权限名称
     * @param {String} action - 具体操作
     */
    toggleElementByPermission(selector, permission, action = 'access') {
        if (this.hasPermission(permission, action)) {
            this.showElement(selector);
        } else {
            this.hideElement(selector);
        }
    }

    /**
     * 初始化页面权限控制
     * @param {String} pageType - 页面类型
     */
    initPagePermissions(pageType) {
        console.log(`Initializing permissions for page: ${pageType}`);
        
        switch (pageType) {
            case 'department':
                this.initDepartmentPermissions();
                break;
            case 'event':
                this.initEventPermissions();
                break;
            case 'user':
                this.initUserPermissions();
                break;
            case 'resource':
                this.initResourcePermissions();
                break;
            case 'report':
                this.initReportPermissions();
                break;
            case 'dispatch':
                this.initDispatchPermissions();
                break;
            default:
                console.warn(`Unknown page type: ${pageType}`);
        }
    }

    /**
     * 初始化部门管理页面权限
     */
    initDepartmentPermissions() {
        if (!this.hasPermission('DEPARTMENT_MANAGEMENT', 'access')) {
            this.showAccessDenied('您没有权限访问部门管理页面');
            return;
        }
        // 只有系统管理员和部门经理可以管理
        this.toggleElementByPermission('#createDepartmentBtn', 'DEPARTMENT_MANAGEMENT', 'manage');
        // 其他按钮根据 scope 控制
        const scope = this.getPermissionScope('DEPARTMENT_MANAGEMENT');
        if (scope === 'department') {
            // 部门经理只能管理自己部门
            // 具体按钮在页面渲染时动态控制
        }
    }

    /**
     * 初始化事件管理页面权限
     */
    initEventPermissions() {
        if (!this.hasPermission('EVENT_MANAGEMENT', 'access')) {
            this.showAccessDenied('您没有权限访问事件管理页面');
            return;
        }
        // 系统管理员主页可管理事件
        // 调度员主页可编辑/增加事件
        // 部门经理主页可管理本部门事件
        // 终端用户主页不可管理事件
        this.toggleElementByPermission('#createEventBtn, .btn[data-bs-target="#createEventModal"]', 'EVENT_MANAGEMENT', 'create');
        this.toggleElementByPermission('.event-edit-btn', 'EVENT_MANAGEMENT', 'edit');
        this.toggleElementByPermission('.event-delete-btn', 'EVENT_MANAGEMENT', 'delete');
    }

    /**
     * 初始化用户管理页面权限
     */
    initUserPermissions() {
        if (!this.hasPermission('USER_MANAGEMENT', 'access')) {
            this.showAccessDenied('您没有权限访问用户管理页面');
            return;
        }
        // 系统管理员可管理所有，调度员可查看，部门经理可管理本部门，终端用户无入口
        this.toggleElementByPermission('#createUserBtn', 'USER_MANAGEMENT', 'create');
        this.toggleElementByPermission('.user-edit-btn, .user-delete-btn', 'USER_MANAGEMENT', 'edit');
    }

    /**
     * 初始化资源管理页面权限
     */
    initResourcePermissions() {
        if (!this.hasPermission('RESOURCE_MANAGEMENT', 'access')) {
            this.showAccessDenied('您没有权限访问资源管理页面');
            return;
        }
        this.toggleElementByPermission('#createResourceBtn', 'RESOURCE_MANAGEMENT', 'create');
        this.toggleElementByPermission('.resource-edit-btn, .resource-delete-btn', 'RESOURCE_MANAGEMENT', 'edit');
    }

    /**
     * 初始化报告管理页面权限
     */
    initReportPermissions() {
        if (!this.hasPermission('REPORT_MANAGEMENT', 'access')) {
            this.showAccessDenied('您没有权限访问报告管理页面');
            return;
        }
        this.toggleElementByPermission('#createReportBtn', 'REPORT_MANAGEMENT', 'create');
        this.toggleElementByPermission('.report-edit-btn, .report-delete-btn', 'REPORT_MANAGEMENT', 'edit');
    }

    /**
     * 初始化调度中心页面权限
     */
    initDispatchPermissions() {
        if (!this.hasPermission('DISPATCH_CENTER', 'access')) {
            this.showAccessDenied('您没有权限访问调度中心页面');
            return;
        }

        // 控制创建事件按钮
        this.toggleElementByPermission('#createEventBtn', 'DISPATCH_CENTER', 'create');
        
        // 控制编辑和指派按钮的显示
        this.toggleElementByPermission('.dispatch-edit-btn, .dispatch-assign-btn', 'DISPATCH_CENTER', 'edit');
    }
}

// 创建全局权限管理器实例
window.PermissionManager = new PermissionManager();

// 导出权限管理器（如果使用模块系统）
if (typeof module !== 'undefined' && module.exports) {
    module.exports = PermissionManager;
} 